/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.ces4.produccion.client.solicitudproduccion;

import co.com.ces4.client.baseView.CreateBase;
import co.com.ces4.produccion.client.SolicitudProduccionService;
import co.com.ces4.produccion.client.SolicitudProduccionServiceAsync;
import co.com.ces4.produccion.client.modales.ArticuloModal;
import co.com.ces4.produccion.client.modales.interfaces.HasArticuloModal;
import co.com.ces4.produccion.client.solicitudproduccion.data.DetalleSolicitudDS;
import co.com.ces4.produccion.client.solicitudproduccion.data.DetalleSolicitudRecord;
import co.com.ces4.produccion.client.utils.Loader;
import co.com.ces4.produccion.jpa.entities.Articulo;
import co.com.ces4.produccion.jpa.entities.DetalleOrdenProduccion;
import co.com.ces4.produccion.jpa.entities.DetalleSolicitudProduccion;
import co.com.ces4.produccion.jpa.entities.OrdenProduccion;
import co.com.ces4.produccion.jpa.entities.SolicitudProduccion;
import co.com.ces4.produccion.jpa.entities.Usuario;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.DateDisplayFormat;
import com.smartgwt.client.types.SelectionAppearance;
import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Button;
import com.smartgwt.client.widgets.Dialog;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.ButtonItem;
import com.smartgwt.client.widgets.form.fields.DateItem;
import com.smartgwt.client.widgets.form.fields.IntegerItem;
import com.smartgwt.client.widgets.form.fields.RadioGroupItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.SectionStackSection;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;

/**
 *
 * @author Sebastian
 */
public class EdicionSolicitudProduccion extends CreateBase implements HasArticuloModal {

    private DateItem dtpFechaSolicitud;
    private TextItem txtNmSolicitud, txtIdentificacionUsuario, txtNombreUsuario, txtLoginUsuario, txtCodigoArticulo, txtDescripcionArticulo;
    private RadioGroupItem solicitudStatusRg;
    private DynamicForm frmAdministracionSolicitud, frmArticulos, frmResultados;
    private Button btnGuardar;
    private SectionStackSection stsAdministracionSolicitud;
    private ButtonItem btnMostrar, btnAgregar, btnEliminar;
    private SectionStackSection stsArticulos;
    private IntegerItem txtCantidad;
    private SectionStackSection stsResultados;
    private HLayout hlyAccionesAdministracionSolicitud;
    private ListGrid detallesSolicitudesGrid;
    private Articulo articulo;
    private Usuario usuario;
    private SolicitudProduccion solicitudProduccion;

    public EdicionSolicitudProduccion(final Usuario usuario) {
        super("Solicitud de Produccion", "100%");
        this.usuario = usuario;
        stsAdministracionSolicitud = new SectionStackSection();
        stsAdministracionSolicitud.setShowHeader(false);
        stsAdministracionSolicitud.setCanCollapse(false);
        stsAdministracionSolicitud.setExpanded(true);

        frmAdministracionSolicitud = new DynamicForm();
        frmAdministracionSolicitud.setWidth100();
        frmAdministracionSolicitud.setNumCols(4);

        txtNmSolicitud = new TextItem("txtNmSolicitud", "Número de la Solicitud");
        txtNmSolicitud.setLength(11);
        txtNmSolicitud.setDisabled(true);

        txtIdentificacionUsuario = new TextItem("txtIdentificacionUsuario", "Identificación del Usuario");
        txtIdentificacionUsuario.setRequired(true);
        txtIdentificacionUsuario.setLength(20);
        txtIdentificacionUsuario.setValue(usuario.getDsid());
        txtIdentificacionUsuario.setDisabled(true);

        txtNombreUsuario = new TextItem("txtNombreUsuario", "Nombre de Usuario");
        txtNombreUsuario.setRequired(true);
        txtNombreUsuario.setLength(50);
        txtNombreUsuario.setValue(usuario.getDsnombre());
        txtNombreUsuario.setDisabled(true);


        txtLoginUsuario = new TextItem("txtLoginUsuario", "Login de Usuario");
        txtLoginUsuario.setRequired(true);
        txtLoginUsuario.setLength(150);
        txtLoginUsuario.setValue(usuario.getDsusuario());
        txtLoginUsuario.setDisabled(true);

        dtpFechaSolicitud = new DateItem("dtpFechaInicio", "Fecha de la Solicitud");
        dtpFechaSolicitud.setUseTextField(true);
        dtpFechaSolicitud.setRequired(true);
        Date fechaActual = new Date();
        dtpFechaSolicitud.setValue(fechaActual);
        dtpFechaSolicitud.setDisabled(true);
        dtpFechaSolicitud.setDateFormatter(DateDisplayFormat.TOEUROPEANSHORTDATE);

        solicitudStatusRg = new RadioGroupItem("solicitudStatus", "Estado");
        solicitudStatusRg.setVertical(false);
        solicitudStatusRg.setDisabled(true);
        LinkedHashMap<String, String> statusOption = new LinkedHashMap<String, String>();
        statusOption.put("a", "Activa");
        statusOption.put("c", "Cancelada");
        solicitudStatusRg.setValueMap(statusOption);
        solicitudStatusRg.setDefaultValue("a");

        btnGuardar = new Button("Guardar");
        btnGuardar.addClickHandler(new ClickHandler() {

            public void onClick(ClickEvent event) {
                guardarSolicitudProduccion();
            }
        });

        hlyAccionesAdministracionSolicitud = new HLayout();
        hlyAccionesAdministracionSolicitud.setMargin(15);
        hlyAccionesAdministracionSolicitud.setAlign(Alignment.CENTER);
        hlyAccionesAdministracionSolicitud.addMember(btnGuardar);
        hlyAccionesAdministracionSolicitud.setMembersMargin(15);
        setSectionContainerItems(hlyAccionesAdministracionSolicitud);

        frmAdministracionSolicitud.setItems(txtNmSolicitud, solicitudStatusRg, txtIdentificacionUsuario, txtNombreUsuario, txtLoginUsuario, dtpFechaSolicitud);
        stsAdministracionSolicitud.addItem(frmAdministracionSolicitud);
        addSection(stsAdministracionSolicitud);

        stsArticulos = new SectionStackSection("Articulos");
        stsArticulos.setCanCollapse(false);
        stsArticulos.setExpanded(true);

        frmArticulos = new DynamicForm();
        frmArticulos.setWidth100();
        frmArticulos.setNumCols(4);
        frmArticulos.setMargin(20);

        txtCodigoArticulo = new TextItem("txtCodigoArticulo", "Código");
        txtCodigoArticulo.setDisabled(true);
        txtCodigoArticulo.setLength(20);

        txtDescripcionArticulo = new TextItem("txtDescripcionArticulo", "Descripción");
        txtDescripcionArticulo.setDisabled(true);
        txtDescripcionArticulo.setLength(50);

        txtCantidad = new IntegerItem("txtCantidad", "Cantidad");
        txtCantidad.setLength(11);

        btnMostrar = new ButtonItem("btnMostrar", "Seleccionar");
        btnMostrar.setStartRow(false);
        btnMostrar.setEndRow(true);
        btnMostrar.addClickHandler(new com.smartgwt.client.widgets.form.fields.events.ClickHandler() {

            public void onClick(com.smartgwt.client.widgets.form.fields.events.ClickEvent event) {
                ArticuloModal art = new ArticuloModal(EdicionSolicitudProduccion.this);
                art.setIsModal(true);
                art.centerInPage();
                art.show();
            }
        });

        frmArticulos.setItems(txtCodigoArticulo, txtDescripcionArticulo, txtCantidad, btnMostrar);
        stsArticulos.setItems(frmArticulos);
        addSection(stsArticulos);

        stsResultados = new SectionStackSection("Detalles de la Solicitud de producción");
        stsResultados.setCanCollapse(false);
        stsResultados.setExpanded(true);

        frmResultados = new DynamicForm();
        frmResultados.setWidth100();
        frmResultados.setNumCols(4);
        frmResultados.setMargin(10);

        detallesSolicitudesGrid = new ListGrid();
        detallesSolicitudesGrid.setWidth100();
        detallesSolicitudesGrid.setHeight100();
        detallesSolicitudesGrid.setFields(DetalleSolicitudRecord.getFields());
        detallesSolicitudesGrid.getField(DetalleSolicitudDS.CODIGOSOLICITUD).setCanHide(false);
        detallesSolicitudesGrid.getField(DetalleSolicitudDS.CODIGOSOLICITUD).setHidden(true);
        detallesSolicitudesGrid.getField(DetalleSolicitudDS.CODIGOSOLICITUD).setCanFilter(false);
        detallesSolicitudesGrid.setEmptyMessage("No hay registros para mostrar");
        detallesSolicitudesGrid.setSelectionType(SelectionStyle.SIMPLE);
        detallesSolicitudesGrid.setSelectionAppearance(SelectionAppearance.CHECKBOX);

        btnAgregar = new ButtonItem("btnAgregar", "Agregar");
        btnAgregar.setColSpan(2);
        btnAgregar.setStartRow(true);
        btnAgregar.setEndRow(false);
        btnAgregar.setAlign(Alignment.RIGHT);
        btnAgregar.addClickHandler(new com.smartgwt.client.widgets.form.fields.events.ClickHandler() {

            public void onClick(com.smartgwt.client.widgets.form.fields.events.ClickEvent event) {
                agregarArticulos();
            }
        });

        btnEliminar = new ButtonItem("btnEliminar", "Eliminar");
        btnEliminar.addClickHandler(new com.smartgwt.client.widgets.form.fields.events.ClickHandler() {

            public void onClick(com.smartgwt.client.widgets.form.fields.events.ClickEvent event) {
                final ListGridRecord[] selectedDetalles = detallesSolicitudesGrid.getSelection();
                final List<DetalleSolicitudProduccion> detalles = new ArrayList<DetalleSolicitudProduccion>();
                for (ListGridRecord detalleRecord : selectedDetalles) {
                    detalles.add((DetalleSolicitudProduccion) detalleRecord.getAttributeAsObject("detalleSolicitudProduccion"));
                }
                if (detalles.isEmpty()) {
                    SC.warn("Advertencia", "Señor usuario, debe seleccionar al menos un detalle para realizar la eiminación", new BooleanCallback() {

                        @Override
                        public void execute(Boolean value) {
                        }
                    }, new Dialog());
                    return;
                }
                SC.confirm("Confirmar Desactivación", "¿Señor usuario, está seguro que desea desactivar los detalles seleccionados?", new BooleanCallback() {

                    public void execute(Boolean value) {
                        if (value) {
                            if (selectedDetalles.length > 0) {
                                for (int i = 0; i < selectedDetalles.length; i++) {
                                    detallesSolicitudesGrid.removeData(selectedDetalles[i]);
                                }
                            }
                            //detallesSolicitudesGrid.removeSelectedData();
                            SC.say("Señor usuario, el(los) detalles seleccionado(s) fueron desactivados correctamente");
                        }
                    }
                });
            }
        });
        btnEliminar.setColSpan(2);
        btnEliminar.setStartRow(false);
        btnEliminar.setEndRow(true);
        btnEliminar.setAlign(Alignment.LEFT);

        frmResultados.setItems(btnAgregar, btnEliminar);
        stsResultados.setItems(frmResultados, detallesSolicitudesGrid);
        addSection(stsResultados);
    }

    public EdicionSolicitudProduccion(final SolicitudProduccion solicitudProduccion) {
        this(solicitudProduccion.getDsusuario());
        this.solicitudProduccion = solicitudProduccion;
        setSectionTitle(0, "Vista Solicitud de Producción");
        txtNmSolicitud.setValue(solicitudProduccion.getNmid());
        txtIdentificacionUsuario.setValue(solicitudProduccion.getDsusuario().getDsid());
        txtNombreUsuario.setValue(solicitudProduccion.getDsusuario().getDsnombre());
        txtLoginUsuario.setValue(solicitudProduccion.getDsusuario().getDsusuario());
        if (solicitudProduccion.getSnestado()) {
            solicitudStatusRg.setValue("a");
        } else {
            solicitudStatusRg.setValue("c");
        }
        setDisableForms();

        for (DetalleSolicitudProduccion detalleSolicitudProduccion : solicitudProduccion.getDetalleSolicitudProduccionList()) {
            detallesSolicitudesGrid.addData(new DetalleSolicitudRecord((detalleSolicitudProduccion)));
        }
    }

    private void guardarSolicitudProduccion() {
        if (frmAdministracionSolicitud.validate()) {
            ListGridRecord[] records = detallesSolicitudesGrid.getRecords();
            if (records.length > 0) {
                Loader.showLoader();
                final SolicitudProduccion tmp = getSolicitudProduccion();
                AsyncCallback<SolicitudProduccion> registrarCallback = new AsyncCallback<SolicitudProduccion>() {

                    @Override
                    public void onFailure(Throwable caught) {
                        SC.warn("Error", caught.getMessage(), new BooleanCallback() {

                            @Override
                            public void execute(Boolean value) {
                            }
                        }, new Dialog());
                        Loader.hideLoader();
                    }

                    @Override
                    public void onSuccess(SolicitudProduccion solicitudPro) {
                        SC.say("Señor usuario, el registro fue guardado correctamente");
                        solicitudProduccion = solicitudPro;
                        setDisableForms();
                        Loader.hideLoader();
                    }
                };
                getSolicitudProduccionService().guardarSolicitudProduccion(tmp, registrarCallback);
            } else {
                SC.warn("Advertencia", "Señor usuario, debe seleccionar mínimo un detalle para la solicitud de producción", new BooleanCallback() {

                    @Override
                    public void execute(Boolean value) {
                    }
                }, new Dialog());
                return;
            }
        }
    }

    private SolicitudProduccion getSolicitudProduccion() {
        SolicitudProduccion solProduccion = new SolicitudProduccion();
        solProduccion.setOrdenProduccionList(new ArrayList<OrdenProduccion>());

        solProduccion.setDsusuario(usuario);
        solProduccion.setFefechaSolicitud(dtpFechaSolicitud.getValueAsDate());
        if (solicitudStatusRg.getValueAsString().equals("a")) {
            solProduccion.setSnestado(true);
        } else {
            solProduccion.setSnestado(false);
        }


        List<DetalleSolicitudProduccion> detalleSolicitudProduccion = new ArrayList<DetalleSolicitudProduccion>();
        ListGridRecord[] records = detallesSolicitudesGrid.getRecords();
        if (records.length > 0) {
            for (int i = 0; i < records.length; i++) {
                DetalleSolicitudProduccion dsp = (DetalleSolicitudProduccion) records[i].getAttributeAsObject("detalleSolicitudProduccion");
                dsp.setSolicitudProduccion(solProduccion);
                detalleSolicitudProduccion.add(dsp);
            }
        }

        solProduccion.setDetalleSolicitudProduccionList(detalleSolicitudProduccion);

        return solProduccion;
    }

    public void modalArticulo(Articulo selection) {
        if (selection != null) {
            txtCodigoArticulo.setValue(selection.getDsid());
            txtDescripcionArticulo.setValue(selection.getDsdescripcion());
            txtCantidad.clearValue();
            articulo = selection;
        }
    }

    private void agregarArticulos() {
        if (txtCodigoArticulo.getValueAsString() != null) {
            if (txtCantidad.getValueAsString() != null) {
                ListGridRecord[] records = detallesSolicitudesGrid.getRecords();
                Boolean existe = false;
                if (records.length > 0) {
                    for (int i = 0; i < records.length; i++) {
                        if (records[i].getAttributeAsString(DetalleSolicitudDS.CODIGOARTICULO).equals(articulo.getDsid())) {
                            existe = true;
                            break;
                        }
                    }
                }

                if (!existe) {
                    DetalleSolicitudProduccion detalle = new DetalleSolicitudProduccion();
                    detalle.setArticulo(articulo);
                    detalle.setDetalleOrdenProduccionList(new ArrayList<DetalleOrdenProduccion>());
                    detalle.setNmcantidad(Integer.valueOf(txtCantidad.getValueAsString()));
                    detallesSolicitudesGrid.addData(new DetalleSolicitudRecord(detalle));
                    frmArticulos.clearValues();
                } else {
                    SC.warn("Advertencia", "Señor usuario, el articulo ya se encuentra en otro detalle", new BooleanCallback() {

                        @Override
                        public void execute(Boolean value) {
                        }
                    }, new Dialog());
                    existe = true;
                    frmArticulos.clearValues();
                    return;
                }
            } else {
                SC.warn("Advertencia", "Señor usuario, debe ingresar una cantidad para el articulo", new BooleanCallback() {

                    @Override
                    public void execute(Boolean value) {
                    }
                }, new Dialog());
                return;
            }
        } else {
            SC.warn("Advertencia", "Señor usuario, debe seleccionar como mínimo un articulo", new BooleanCallback() {

                @Override
                public void execute(Boolean value) {
                }
            }, new Dialog());
            return;
        }
    }

    private void setDisableForms() {
        txtNmSolicitud.setValue(solicitudProduccion.getNmid());
        btnMostrar.setDisabled(true);
        btnGuardar.setDisabled(true);
        btnAgregar.setDisabled(true);
        btnEliminar.setDisabled(true);
        frmAdministracionSolicitud.setDisabled(true);
        frmArticulos.setDisabled(true);
        frmResultados.setDisabled(true);
        detallesSolicitudesGrid.setDisabled(true);
    }

    private SolicitudProduccionServiceAsync getSolicitudProduccionService() {
        return GWT.create(SolicitudProduccionService.class);
    }
}
